package com.bjpowernode.sparsearray;

import java.io.*;

/**
 * @ClassName com
 * @Description TODO  稀疏数组 —— 个人演示
 *                    先转成稀疏数组，然后进行存盘，存入的是一个对象
 * @date 2021/9/14 15:50
 * @Author ZY
 */
public class Demo1 {
    public static void main(String[] args) throws IOException {
        int[][] twoArray = new int[10][10]; // 十行十列的二维数组
        twoArray[2][1] = 5;
        twoArray[3][5] = 9;
        twoArray[0][8] = -6;
        twoArray[4][2] = 8;

        int count = 0; // 计算有效数字，作为稀疏数组的行数
        for (int[] ints : twoArray) {
            for (int anInt : ints) {
                if (anInt != 0){
                    count++;
                }
                System.out.print(anInt + "\t");
            }
            System.out.println();
        }
        System.out.println(count);

        System.out.println(twoArray.length);
        System.out.println("==============================================");
        // 创建一个稀疏数组
        int[][] sparseArray = new int[count + 1][3];
        sparseArray[0][0] = twoArray.length; // 原二维数组的行数
        sparseArray[0][1] = twoArray[0].length;  // 原二维数组的列数
        sparseArray[0][2] = count; // 原二维数组的有效数字
        int countFlag = 1;
        for (int i = 0; i < twoArray.length; i++) {
            for (int j = 0; j < twoArray[i].length; j++) {
                if (twoArray[i][j] != 0){
                    sparseArray[countFlag][0] = i;
                    sparseArray[countFlag][1] = j;
                    sparseArray[countFlag][2] = twoArray[i][j];
                    countFlag++;
                }
            }
        }

        // 打印一下稀疏数组，看看是否是自己预料的
        for (int[] ints : sparseArray) {
            for (int anInt : ints) {
                System.out.print(anInt + "\t");
            }
            System.out.println();
        }
        // 确实是自己想要的稀疏数组，但是怎么打印到文件中呢？
        // 这里本应该是用try……catch，但是 whatever
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("DataStructure/myfile.data"));
        out.writeObject(sparseArray);
        out.flush();
        out.close();

    }
}
